package qdu.edu.com.fushanf4.service.count.usertype;

import org.apache.hadoop.io.NullWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import qdu.edu.com.fushanf4.utils.ConfigurationUtil;
import qdu.edu.com.fushanf4.utils.DriverUtil;

import java.io.IOException;

/**
 * 用来统计某个字与某一用户类型的关联度
 * 读一行，找关联度最高或者关联度超过某一阈值（10）的用户类型，然后把该列的第一行分配给该用户类型
 * 统计分配到的字符串中汉字的频率
 * 对结果进行排序
 *
 * 考虑是先找出需要的第一列数据，存到文件中
 * 再统计文件中每个汉字的数目
 * 之后对数目进行排序
 *
 * 涉及到对输出文件的命名
 *
 * 是将用户类型与每一个字符串匹配，然后输出到对应序号的文件，还是每个用户类型字符串都进行取余（%）计算，然后输出到对应的文件
 * 考虑先得出结果，之后再对计算过程进行优化，现在不是直接考虑优化的时候
 * 选字符串匹配的
 *
 * 上面已完成 Mapper中找出最大的double，然后找到对应的用户类型字符串，匹配字符串，输出到该字符串对应的文件中，
 *
 * TODO 或者直接以字符串作为输出的文件名
 * TODO 批量处理所有输出的文件，分别进行上面的计数和排序操作
 */
public class ClassificationOfProductDescriptionsByUserTypeDriver extends DriverUtil {
    public static void main(String[] args) throws IOException {
        ClassificationOfProductDescriptionsByUserTypeDriver classificationOfProductDescriptionsByUserTypeDriver = new ClassificationOfProductDescriptionsByUserTypeDriver();
        classificationOfProductDescriptionsByUserTypeDriver.run(args);
    }

    @Override
    public Job runJob(String[] path) throws IOException {
        Job job = ConfigurationUtil.getJob();

        // 设置Driver
        job.setJarByClass(ClassificationOfProductDescriptionsByUserTypeDriver.class);
        // 设置Mapper和Reducer
        job.setMapperClass(ClassificationOfProductDescriptionsByUserTypeMapper.class);
        job.setReducerClass(ClassificationOfProductDescriptionsByUserTypeReducer.class);

        // 设置Partitioner
        job.setPartitionerClass(ClassificationOfProductDescriptionsByUserTypePartitioner.class); // 使用默认的Partitioner
        job.setNumReduceTasks(42);

        // 设置输出
        job.setMapOutputKeyClass(Text.class);   // 用户类型字符串
        job.setMapOutputValueClass(Text.class); // 对应的商品描述
        job.setOutputKeyClass(NullWritable.class);      // 空
        job.setOutputValueClass(Text.class);    // 商品描述

        assert ConfigurationUtil.setPathAndRunJob(path, job);
        return job;
    }
}
